package com.ftg.learn;


import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * @author kangjx
 * @createTime 2023/1/10
 */
public class Mq {

    /**
     * mq :MQ（Message Queue）消息队列，是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦，
     *  异步消息，流量削峰等问题，实现高性能，高可用，可伸缩和最终一致性架构
     * 作用是什么 ？
     *  异步消息，流量削峰等
     * 场景是什么 ?
     * 1 :  大量请求
     * 2 : 发送短信 : 异步通信
     */

    public static void main(String[] args) {

        //队列名称 [先进先出]
        String queueName = "first";
        // 打开我们的 连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();

        //设置 连接的主机
        connectionFactory.setHost("127.0.0.1");
//        connectionFactory.setPort(15672);
        // 这是操作端口号
        connectionFactory.setPort(5673);

        //通过工厂生产一个连接用来  连接上我们的rabbit服务器
        try(Connection connection = connectionFactory.newConnection()){

            //打开通道
            Channel channel = connection.createChannel();
            // queue 队列名称
            // durable : 是否持久化队列的声明默认是存放到内存中的，如果rabbitmq重启会丢失队列(即便队列中有数据), 保存到Erlang自带的Mnesia数据库中
               // 只有同时设置了队列持久化和消息持久化，消息才会保存
               // channel.basicPublish("交换机名称", "路由类型", MessageProperties.PERSISTENT_TEXT_PLAIN, "消息主体".getBytes());
            // exclusive  是否排外
            // autoDelete : 当最后一个消费者断开连接之后队列是否自动被删除
            // arguments
            channel.queueDeclare(queueName, true, false, false, null);
            //通过 推送信息
            // exchange 交换机,
            // routingKey 路由主键 队列名称
            // props AMQP.BasicProperties 下面的基础信息
            // body 发送的主体 (才是你要发送给 mq的 内容)
            String message = "{telphone:15326619037,message : \"亲爱的康先生您好，你喜正我们公司的3亿大奖\"}";
            channel.basicPublish("", queueName, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());



            System.out.println(" [x] Sent '" + message + "'");

        } catch (IOException | TimeoutException e) {
            e.printStackTrace();
        }

        //java client
//        首先，先连接上rabbit 
        
        //打开信道一样的东西 
        
        //把message 通过通道存储到queue里面

        //rabbit queue message

        //就是把我们的  hello rabbitmq  发送到 127.0.0.1:5673 这个主机的 /虚拟机上面的 队列 first 里面了

        /**
         * 表级别 : 查询次数要高于添加 、修改  删除
         *  1 ： 按照常用查询条件来创建索引 ,通过索引提高带参查询数据
         *        索引失效 ： 你没有按照索引查询  ， 没有使用最左原则
         *  2 ：  数据量级别较大
         *  2.1 使用历史表,按照年份来生成历史表，通过历史表来分流我们的数据量
         *  2.2 对单表使用表分区   按月份分区
         * 库级别 ： 读写分离 A(读) myisam 存储引擎 对索引支持更好  - 中间要存在数据同步问题 [4个9 5个9 数据一致性问题(C) ] -   B（写）可以使用innodb存储引擎 全整 acid
         *       ：  双活
         *       ： 三活 双读一写
         *       : 热备
         *       ： 两地三中心
         * sql 级别 :
         *    where a = null a is null
         *    where len(name) = 3;  速度慢
         *    count(主键)
         *
         */


    }

}
